/**
 * 本文件负责对数组进行处理
 */

/**
 * 克隆数组
 * @param {Array} actual
 * @returns {Array}
 */
function cleanArray(actual) {
  const newArray = [];
  for (let i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}
/**
 * 数组去重
 * @param {*} arr
 * @returns  arr
 */
function unique(arr) {
  //创建一个空对象
  //用来存放数组中已经出现过至少一次的元素
  let obj = {};

  //对原数组进行过滤,只保留之前没有出现过的
  return arr.filter((item) => {
    //下面一行的目的是
    //对数组中引用类型的元素,的内容进行比较
    //因为引用类型如果直接比较永远不相等,无法判断是否重复
    //JSON.stringify(item)会将item中所有内容递归地都调用一次toString()方法
    //转换成字符串形式
    //item再和后面的字符串拼接,会自动调用item.toString()方法进行类型转换
    //这样就可以得到item的类型,[object Object],function a(){}
    //item.toString和JSON.stringify(item)拼接成的字符串就可以唯一确定一个元素
    let newItem = item + JSON.stringify(item);
    // function a(){}undefined
    // [object Object]{"a":15}

    //返回一个布尔值
    //此前出现过为true
    //否则为false
    //如果此前未出现过,则此次第一次出现,放入obj
    return obj.hasOwnProperty(newItem) ? false : (obj[newItem] = true);
  });
}

module.exports = {
  cleanArray,
};
